package com.xrit.sunnyday.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.xrit.sunnyday.dao.OrderSettingDao;
import com.xrit.sunnyday.exception.SunnydayException;
import com.xrit.sunnyday.pojo.OrderSetting;
import com.xrit.sunnyday.service.OrderSettingService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Service(interfaceClass = OrderSettingService.class)
public class OrderSettingServiceImpl implements OrderSettingService {
    @Autowired
    private OrderSettingDao orderSettingDao;

    @Override
    public void add(List<OrderSetting> orderSettingList) {
        //1.遍历，挨个取出每一行(OrderSetting)
        for (OrderSetting os : orderSettingList) {
            //2.取出日期
            Date orderDate = os.getOrderDate();
            /**
             * 3.拿日期查询数据表里边是否存在重复，如果重复代表医生现在要进行更新
             * 逻辑：
             * 存在
             * 判断数据库表中已预约人数是否大于 要更新的 可预约人数
             *  大于 则报错
             *  小于 则更新可预约数
             * 不存在
             *  则插入预约设置
             */
            OrderSetting osInDb = orderSettingDao.findByOrderDate(orderDate);
            //判断对应的日期是否存在(excel中一行对应一个OrderSetting实体)
            if (null!=osInDb){//存在该日期
                //判断数据库表中已预约人数是否大于 要更新的 可预约人数,反之抛异常
                if (osInDb.getReservations()>os.getNumber()){
                    //大于 则报错
                    throw new SunnydayException(os.getOrderDate()+"中，已预约的人数比你现在设置的可预约人数要大");
                }
                //小于 则更新可预约数
                orderSettingDao.updateNumber(os);
            }else {//不存在
                orderSettingDao.add(os);
            }
        }
    }

    /**
     * 根据日期查询预约设置数据
     */
    @Override
    public List<Map<String, Integer>> getOrderSettingByMonth(String month) {
        //1.拼接开始日期
        String startDate = month + "-01";//2121-12-01
        //2.拼接结束日期,Mysql中如果只有30天的月份，即使判断<31也会莫名报错
        //String endDate = month + "-31";
        // 调用dao查询
        //Map<String,String> map = new HashMap<String,String>();
        //map.put("startDate",startDate);
        //map.put("endDate",endDate);
        //return orderSettingDao.getOrderSettingByMonth(map);

        //2.换一种方式，只传开始日期，使用Mysql的函数“SELECT LAST_DAY('yyyy-MM-dd')”,会找出对应MM月的最后一天
        return orderSettingDao.getOrderSettingByMonth(startDate);
    }

    /**
     * 通过日期设置预约信息
     */
    @Override
    public void editNumberByDate(OrderSetting orderSetting) {
        //获取前端传递过来的日期
        Date orderDate = orderSetting.getOrderDate();
        //通过日期判断预约设置是否存在？
        OrderSetting osInDb = orderSettingDao.findByOrderDate(orderDate);
        //- 存在：
        if(null != osInDb) {
            // 判断已经预约的人数是否大于要更新的最大可预约人数， reverations > 传进来的number数量，则不能更新，要报错
            if(osInDb.getReservations() > orderSetting.getNumber()){
                // 已经预约的人数高于最大预约人数，不允许
                throw new SunnydayException("最大预约人数不能小已预约人数！");
            }
            // reverations <= 传进来的number数量，则要更新最大可预约数量
            orderSettingDao.editNumberByOrderDate(orderSetting);
        }else {
            //- 不存在：
            //  - 添加预约设置信息
            orderSettingDao.add(orderSetting);
        }
    }
}